/**
 * @file arg.h
 * @author Majjcom
 * @brief Args for MayEvent
 * @version 0.1
 * @date 2022-08-04
 * 
 * @copyright Copyright (c) 2022 Majjcom
 * 
 */

#include <string>
#include <memory>
#include <map>

typedef std::shared_ptr<void> PARGOBJ;

/**
 * @brief 指针参数的简单封装
 * 
 */
class ArgPoiner
{
public:
    ArgPoiner(void* ptr_);

    /**
     * @brief 获取指针
     * 
     * @return void* 
     */
    void* get();
private:
    void* ptr;
};

/**
 * @brief 可变长度参数对象
 * 
 * @tparam T 
 */
template<class T>
class Argobj
{
public:
    Argobj();
    ~Argobj();

    /**
     * @brief 添加参数
     * 
     * @param name 参数名称
     * @param val  参数值
     */
    void addArgument(std::string name, const T val);

    /**
     * @brief 获取指定参数
     * 
     * @param name 参数名称
     * @param ret  返回指针
     * @return int 0为成功，非0为失败
     */
    int getArgument(std::string name, T* ret);

    /**
     * @brief Get the Argument Count object
     * 
     * @return size_t 
     */
    size_t getArgumentCount();
private:
    std::map<std::string, T> args;
};

template<typename T>
Argobj<T>& getArgobj(PARGOBJ ptr);
